#ifndef C_H_H
#define C_H_H
#include <cstring>
#include <thread>
#include <chrono>
#include <vector>
#include <array>
#include <fstream>
#include "pid_controller.h"
#include <iostream>
#include <mutex>  // 添加此行
#include <atomic>  // 添加此行以使用 std::atomic
#include <opencv2/opencv.hpp> // 添加 OpenCV 头文件
#include <sys/socket.h> // 添加 socket 相关头文件
#include <arpa/inet.h>  // 添加 inet 相关头文件
#include <unistd.h>     // 添加 close 函数
#include <opencv2/imgcodecs.hpp> // 添加 OpenCV 图像编码头文件
#include "zf_common_headfile.h"  // 添加新的头文件
// 图像大小定义
#define LCDW 80          // 图像宽度
#define LCDH 60          // 图像高度
#define IMAGE_WIDTH 160   // 图像宽度
#define IMAGE_HEIGHT 120  // 图像高度
#define IMAGE_CENTER 80   // 图像中心列

// 扫描行定义
#define BOTTOM_LINE 119      // 底部行
#define BOTTOM_ROW 119       // 底部行
#define START_SCAN_LINE 114  // 开始扫描的行
#define TOP_SCAN_ROW 4       // 顶部扫描行

// 边界相关定义
#define ImageSensorMid 40//80            // 图像中点
#define MIN_LINE_WIDTH 14            // 最小线宽
#define MIN_WIDTH 14                 // 最小宽度阈值
#define BORDER_THRESHOLD 20          // 边界阈值
#define MIN_RIGHT_BORDER 20          // 右边界最小值
#define MAX_LEFT_BORDER 140          // 左边界最大值
#define MIN_BORDER_DISTANCE 20       // 最小边界距离
#define MAX_BORDER_DISTANCE 300      // 最大边界距离

// 扫描参数定义
#define ImageScanInterval 2         // 扫描间隔
#define ImageScanInterval_Cross 2   // 十字扫描间隔
#define SCAN_STEP 2                  // 扫描步长
#define BORDER_JUMP 3                // 边界跳变阈值

// 跳变点类型定义
typedef struct {
    int point;
    uint8_t type;
} JumpPointtypedef;

// 图像处理数据类型定义
typedef struct {
    uint8_t IsRightFind;      // 右边有边标志
    uint8_t IsLeftFind;       // 左边有边标志
    int Wide;                 // 边界宽度
    int LeftBorder;          // 左边界
    int RightBorder;         // 右边界
    int Center;              // 中线
    int RightTemp;           // 右边临时值
    int LeftTemp;            // 左边临时值
    int close_LeftBorder;    // 靠边边界
    int close_RightBorder;   // 靠边边界
    
    // OTSU相关参数
    int LeftBoundary;        // OTSU左边界
    int RightBoundary;       // OTSU右边界
    int LeftBoundary_First;  // OTSU首次左边界
    int RightBoundary_First; // OTSU首次右边界
} ImageDealDatatype;

// 元素类型
typedef enum {
    Normol,       // 无任何特征
    Straight,     // 直道
    Cross,        // 十字
    Ramp,         // 坡道
    LeftCirque,   // 左圆环
    RightCirque,  // 右圆环
    Forkin,       // 岔路进口
    Forkout,      // 岔路出口
    Barn_out,     // 出库
    Barn_in,      // 入库
    Cross_ture,   // 真实十字
} RoadType_e;

// 图像状态类型定义
typedef struct {
    int OFFLine;           // 截止行
    int WhiteLine;         // 丢线数
    int Threshold_static;  // 二值化阈值
    int Threshold_detach;  // 动态阈值
    int TowPoint;          // 丢线点数
    int TowPoint_True;     // 双边丢线阈值
    RoadType_e Road_type;  // 道路类型
    char CirquePass;       // 圆环通过标志
    char IsCinqueOutIn;    // 圆环出入标志
    char CirqueOut;        // 圆环出口标志
    char CirqueOff;        // 圆环关闭标志
    int Det_True;          // 图像偏差
    
    // OTSU相关状态参数
    int OFFLineBoundary;   // OTSU边界截止行
    int WhiteLine_L;       // 左边丢线计数
    int WhiteLine_R;       // 右边丢线计数
    int Right_Line;
    int Left_Line;
} ImageStatustype;

// 添加速度数据结构
typedef struct {
    float nowspeed;     // 当前速度
    int MinSpeed;       // 最小速度
} SpeedDatatype;

// 添加系统数据结构
typedef struct {
    SpeedDatatype SpeedData;
} SystemDatatype;

typedef struct {
    int16 image_element_rings;                  // 0:无圆环  1:左圆环  2:右圆环
    int16 ring_big_small;                       // 0:无      1:大圆环  2:小圆环
    int16 image_element_rings_flag;             // 圆环标志位
    int16 straight_long;                        // 长直道标志位
} ImageFlagtypedef;

// 全局变量声明
extern cv::VideoCapture cap;
extern uint8_t Pixle[LCDH][LCDW];
extern ImageDealDatatype ImageDealArr[120];
extern ImageStatustype ImageStatus;
extern SystemDatatype SystemData;
extern int Road_flag;
extern int sock;  // 添加socket全局变量声明
extern float Speed_Goal;               // 目标速度
extern PIDController pid;
extern IncrementalPIDController incremental_pid; // 创建增量式 PID 控制器实例
// 函数声明
bool initCamera();
void getCompressedImage();
void LimitL(int& value);
void LimitH(int& value);
void GetJumpPointFromDet(uint8_t* p, uint8_t type, int L, int H, JumpPointtypedef* Q);
uint8_t DrawLinesFirst(void);
void DrawLinesProcess(void);
void DrawExtensionLine(void);
void ImageProcess();
// 新增系统初始化和控制相关函数声明
void init_system(void);        // 系统初始化
void init_threads(void);       // 线程初始化
void init_network(void);       // 网络初始化
void run_main_loop(void);      // 主循环函数
#endif // C_H_H 